//  防止篡改对象
// Object.seal() 防止新增和删除属性  在严格模式下会报错
'use strict'

var person = {
	name: 'yin'
}
Object.seal(person)
delete person.name
person.age = 21;
// 会报错

// Object.freeze冻结对象，这个不能改属性值
Object.freeze(person);

// 可以使用Object.isFrozen, Object.isSealed, Object.isExtensible判定对象状态


// defineProperty冻结单个属性
Object.defineProperty(person, 'grade', {
    enumerable: false,  // 定义该属性不可遍历
    value: 3,
    writable: false   // 定义该属性不能写
})


// ------------------------------------
// 函数绑定
// 把一个函数当作参数传给另外一个函数执行，此时函数执行上下文往往会发生变化
class DrawTool {
    constructor() {
        this.points = [];
    }
    handleMouseClick(event) {
        this.points.push(event.latLng);
    }
    init() {
        $map.on('click', this.handleMouseClick);
    }
}
// click事件的执行回调里面this不是指向了DrawTool的实例了，所以里面的this.points将会返回undefined。
// 第一种解决方法是使用闭包，先把this缓存一下，变成that：
class DrawTool {
    constructor() {
        this.points = [];
    }
    handleMouseClick(event) {
        this.points.push(event.latLng);
    }
    init() {
        let that = this;
        $map.on('click', event => that.handleMouseClick(event));
    }
}

// 使用箭头函数  箭头函数的this还是只想父级的上下文，固然不用创建闭包
class DrawTool {
    init() {
        $map.on('click', 
                event => this.handleMouseClick(event));
    }
}

// es5语法使用 bind()  call() apply()  改变上下文的执行环境
class DrawTool {
    init() {
        $map.on('click', 
                this.handleMouseClick.bind(this))
    }
}


// -----------------------------------
// 惰性加载函数
// 有时候需要在代码里面做一些兼容性判断，或者是做一些UA的判断，如下代码所示：
//UA的类型
function getUAType() {
    let ua = window.navigator.userAgent;
    if (ua.match(/renren/i)) {
        return 0;
    }
    else if (ua.match(/MicroMessenger/i)) {
        return 1;
    }
    else if (ua.match(/weibo/i)) {
        return 2;
    }
    return -1;
}
/*
这个函数的作用是判断用户是在哪个环境打开的网页，以便于统计哪个渠道的效果比较好。
这种类型的判断都有一个特点，就是它的结果是死的，不管执行判断多少次，都会返回相同的结果，
例如用户的UA在这个网页不可能会发生变化（除了调试设定的之外）。所以为了优化，才有了惰性函数一说，
上面的代码可以改成
*/
//UA的类型
function getUAType() {
    let ua = window.navigator.userAgent;
    if(ua.match(/renren/i)) {
        pageData.getUAType = () => 0;
        return 0;
    }
    else if(ua.match(/MicroMessenger/i)) {
        pageData.getUAType = () => 1;
        return 1;
    }
    else if(ua.match(/weibo/i)) {
        pageData.getUAType = () => 2;
        return 2;
    }
    return -1;
}
// 另外一种简单实现
let ua = window.navigator.userAgent;
let UAType = ua.match(/renren/i) ? 0 :
                ua.match(/MicroMessenger/i) ? 1 :
                ua.match(/weibo/i) ? 2 : -1;


